package com.christina.engine.state.impl;

import com.christina.engine.state.AbstractConversationState;
import com.christina.engine.state.ConversationState;
import com.christina.engine.state.model.StateContext;
import com.christina.engine.state.model.StateTransitionResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;

/**
 * 完成状态
 * 表示当前任务已完成，等待用户的下一步指示
 * 
 * @author Christina
 */
@Component
@Slf4j
public class CompletedState extends AbstractConversationState {
    
    public static final String STATE_NAME = "Completed";
    
    public CompletedState() {
        super(STATE_NAME, StateType.COMPLETED, 120000); // 2分钟超时
    }
    
    @Override
    protected StateTransitionResult doOnEnter(StateContext context) {
        // 标记任务完成
        context.setStateData("taskCompleted", true);
        context.setStateData("completionTime", java.time.LocalDateTime.now());
        
        // 生成完成消息
        String completionMessage = generateCompletionMessage(context);
        
        return StateTransitionResult.waitForUserInput(completionMessage);
    }
    
    @Override
    protected StateTransitionResult doHandleMessage(String message, StateContext context) {
        // 验证输入
        ValidationResult validation = validateInput(message, context);
        if (!validation.isValid()) {
            return StateTransitionResult.stayInCurrentState(validation.getErrorMessage());
        }
        
        // 处理结束对话命令
        if (isEndCommand(message)) {
            return StateTransitionResult.endConversation("谢谢使用Christina智能助手！祝您生活愉快！");
        }
        
        // 处理帮助命令
        if (isHelpCommand(message)) {
            return StateTransitionResult.stayInCurrentState(getHelpMessage(context));
        }
        
        // 分析用户是否需要新的帮助
        String intent = analyzeFollowUpIntent(message, context);

        return switch (intent) {
            case "new_request" ->
                // 用户有新的请求，回到初始状态
                    StateTransitionResult.success(
                            getInitialState(),
                            "好的，我来帮您处理新的请求。"
                    );
            case "continue_current" ->
                // 用户想要继续当前任务，回到信息收集状态
                    StateTransitionResult.success(
                            getInformationGatheringState(),
                            "好的，让我们继续完善您的需求。"
                    );
            case "satisfied" ->
                // 用户满意当前结果
                    StateTransitionResult.endConversation(
                            "很高兴能够帮助您！如果还有其他需要，随时可以联系我。"
                    );
            case "feedback" -> {
                processFeedback(message, context);
                yield StateTransitionResult.stayInCurrentState(
                        "感谢您的反馈！还有其他需要帮助的吗？"
                );
                // 用户提供反馈
            }
            default ->
                // 无法确定意图，询问用户
                    StateTransitionResult.stayInCurrentState(
                            "我不太确定您的意思。您是需要新的帮助，还是想要结束对话？"
                    );
        };
    }
    
    @Override
    protected StateTransitionResult doOnTimeout(StateContext context) {
        return StateTransitionResult.endConversation(
                "看起来您已经完成了所需的操作。如果还有其他需要，随时可以联系我！"
        );
    }
    
    @Override
    public List<ConversationState> getPossibleNextStates(StateContext context) {
        return Arrays.asList(
                getInitialState(),
                getInformationGatheringState()
        );
    }
    
    @Override
    protected String getHelpMessage(StateContext context) {
        return """
                当前任务已完成！

                您可以：
                • 说 '还有其他问题' 或 '新的请求' 来开始新的对话
                • 说 '继续' 或 '修改' 来调整当前结果
                • 说 '谢谢' 或 '再见' 来结束对话
                • 提供反馈来帮助我改进服务

                请告诉我您的选择。""";
    }
    
    /**
     * 生成完成消息
     * 
     * @param context 状态上下文
     * @return 完成消息
     */
    private String generateCompletionMessage(StateContext context) {
        String targetService = context.getStateData("targetService", "");
        
        String baseMessage = switch (targetService) {
            case "travel" -> "您的旅行规划已完成！我已经为您准备了详细的行程安排。";
            case "user" -> "您的设置已成功更新！";
            case "chat" -> "我已经回答了您的问题。";
            default -> "任务已完成！";
        };

        return baseMessage + "\n\n还有其他需要帮助的吗？您可以：\n" +
               "• 提出新的问题或请求\n" +
               "• 说 '谢谢' 结束对话\n" +
               "• 提供反馈帮助我改进";
    }
    
    /**
     * 分析后续意图
     * 
     * @param message 用户消息
     * @param context 状态上下文
     * @return 意图类型
     */
    private String analyzeFollowUpIntent(String message, StateContext context) {
        String lowerMessage = message.toLowerCase().trim();
        
        // 结束对话的意图
        if (lowerMessage.contains("谢谢") || lowerMessage.contains("再见") || 
            lowerMessage.contains("没有") || lowerMessage.contains("不用") ||
            lowerMessage.contains("thank") || lowerMessage.contains("bye") ||
            lowerMessage.equals("ok") || lowerMessage.equals("好的")) {
            return "satisfied";
        }
        
        // 新请求的意图
        if (lowerMessage.contains("还有") || lowerMessage.contains("另外") || 
            lowerMessage.contains("新的") || lowerMessage.contains("其他") ||
            lowerMessage.contains("想要") || lowerMessage.contains("需要") ||
            lowerMessage.contains("帮我") || lowerMessage.contains("请")) {
            return "new_request";
        }
        
        // 继续当前任务的意图
        if (lowerMessage.contains("继续") || lowerMessage.contains("修改") || 
            lowerMessage.contains("调整") || lowerMessage.contains("改") ||
            lowerMessage.contains("不对") || lowerMessage.contains("错了") ||
            lowerMessage.contains("重新")) {
            return "continue_current";
        }
        
        // 反馈意图
        if (lowerMessage.contains("很好") || lowerMessage.contains("不错") || 
            lowerMessage.contains("满意") || lowerMessage.contains("棒") ||
            lowerMessage.contains("差") || lowerMessage.contains("不好") ||
            lowerMessage.contains("建议") || lowerMessage.contains("意见")) {
            return "feedback";
        }
        
        return "unknown";
    }
    
    /**
     * 检查是否为结束命令
     * 
     * @param input 用户输入
     * @return 是否为结束命令
     */
    private boolean isEndCommand(String input) {
        if (input == null) {
            return false;
        }
        
        String lowerInput = input.toLowerCase().trim();
        return lowerInput.equals("谢谢") || 
               lowerInput.equals("再见") || 
               lowerInput.equals("goodbye") || 
               lowerInput.equals("bye") ||
               lowerInput.equals("没有了") ||
               lowerInput.equals("不用了") ||
               lowerInput.equals("结束");
    }
    
    /**
     * 处理用户反馈
     * 
     * @param feedback 反馈内容
     * @param context 状态上下文
     */
    private void processFeedback(String feedback, StateContext context) {
        // 保存反馈信息
        context.setStateData("userFeedback", feedback);
        context.setStateData("feedbackTime", java.time.LocalDateTime.now());
        
        // 这里可以添加反馈处理逻辑，如发送到分析系统等
        log.info("Received user feedback for session {}: {}",
                context.getSessionId(), feedback);
    }
    
    private ConversationState getInitialState() {
        return new InitialState();
    }
    
    private ConversationState getInformationGatheringState() {
        return new InformationGatheringState();
    }
}